package com.qf.erp_system_admin.controller;

import com.alibaba.excel.EasyExcel;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qf.erp_system_admin.config.OrderReadListener;
import com.qf.erp_system_admin.entity.*;
import com.qf.erp_system_admin.service.OrderService;
import com.qf.erp_system_admin.util.R;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;

/**
 * --- 一点都不难 ---
 *
 * @author DZW
 * @date 2024/7/22
 * @desc
 */
@RequestMapping("/order/form")
@RestController
public class OrderController {
    private Logger logger = LogManager.getLogger(OrderController.class);

    @Autowired
    private OrderService orderService;

    /**
     * 查询全部订单信息
     * @param map 分页查询所需关键字
     * @return 分页后的全部数据
     */
    @GetMapping("/findAll")
    public R findAll(@RequestParam HashMap<String, String> map) {
        int pageNum = Integer.parseInt(map.get("pageNum"));
        int pageSize = Integer.parseInt(map.get("pageSize"));

        // 1.开始分页
        PageHelper.startPage(pageNum, pageSize);

        List<Order> list = orderService.findAll(map);

        // 2.获得全部分页信息
        PageInfo<Order> pageInfo = new PageInfo<>(list);

        return R.ok(pageInfo);
    }

    /**
     * 查找所有的未发货订单信息
     *
     * @param map 前端发送得到页面信息
     * @return 所有的未发货订单信息
     */
    @GetMapping("findShip")
    public R findShip(@RequestParam HashMap<String, String> map) {
        int pageNum = Integer.parseInt(map.get("pageNum"));
        int pageSize = Integer.parseInt(map.get("pageSize"));
        PageHelper.startPage(pageNum, pageSize);
        List<Order> list = orderService.findShip(map);
        PageInfo<Order> pageInfo = new PageInfo<>(list);
        return R.ok(pageInfo);
    }

    /**
     * 查找所有的未收获订单信息
     *
     * @param map 前端发送得到页面信息
     * @return 所有的待收货订单信息
     */
    @GetMapping("findPut")
    public R findPut(@RequestParam HashMap<String, String> map) {
        int pageNum = Integer.parseInt(map.get("pageNum"));
        int pageSize = Integer.parseInt(map.get("pageSize"));
        PageHelper.startPage(pageNum, pageSize);
        List<Order> list = orderService.findPut(map);
        PageInfo<Order> pageInfo = new PageInfo<>(list);
        return R.ok(pageInfo);
    }

    /**
     * 查找所有的待付款订单信息
     *
     * @param map 前端发送得到页面信息
     * @return 所有的待付款订单信息
     */
    @GetMapping("noPay")
    public R noPay(@RequestParam HashMap<String, String> map) {
        int pageNum = Integer.parseInt(map.get("pageNum"));
        int pageSize = Integer.parseInt(map.get("pageSize"));
        PageHelper.startPage(pageNum, pageSize);
        List<Order> list = orderService.noPay(map);
        PageInfo<Order> pageInfo = new PageInfo<>(list);
        return R.ok(pageInfo);
    }

    /**
     * 查找所有的交易完毕订单信息
     *
     * @param map 前端发送得到页面信息
     * @return 所有的交易完成订单信息
     */
    @GetMapping("overDeal")
    public R overDeal(@RequestParam HashMap<String, String> map) {
        int pageNum = Integer.parseInt(map.get("pageNum"));
        int pageSize = Integer.parseInt(map.get("pageSize"));
        PageHelper.startPage(pageNum, pageSize);
        List<Order> list = orderService.overDeal(map);
        PageInfo<Order> pageInfo = new PageInfo<>(list);
        return R.ok(pageInfo);
    }

    /**
     * 发货按钮方法。点击后将状态改为发货
     * @param id 前端返回的点击行的订单的id
     * @return 更改成功或失败
     */
    @GetMapping("/upShipSta")
    public R updateShipSta(int id) {
        boolean isOk = orderService.updateShipSta(id);
        return R.ok(isOk);
    }

    /**
     * 查询订单详情页中的客户信息
     * @param id 订单表和客户表的关联列cliId
     * @return 客户信息
     */
    @GetMapping("moreCli")
    public R moreMessage(int id){
        HashMap<String,Client> map = orderService.moreMessage(id);
        return R.ok(map);
    }

    /**
     * 查询订单详情页中的商品信息
     * @param id 订单表和客户表的关联列cliId
     * @return 客户信息
     */
    @GetMapping("moreGood")
    public R moreGood(int id){
        List<GoodsVo> list = orderService.moreGoods(id);
        return R.ok(list);
    }


    /**
     * 查询全部商品信息方法，合并后需删除，前端改为商品模块的查询全部方法
     * @return 商品数组
     */
    @GetMapping("findGoods")
    public R findGoods(){
        List<Goods> list = orderService.findGoods();
        return R.ok(list);
    }
    /**
     * 查询全部客户信息方法，合并后需删除，前端改为商品模块的查询全部方法
     * @return 商品数组
     */
    @GetMapping("cliAll")
    public R findAllClient(){
        List<Client> list = orderService.findAllClient();
        return R.ok(list);
    }

    @PostMapping("/addClient")
    public R addAll(@RequestParam List<Object> list){
        System.out.println("list-----"+list);
        boolean isOk = orderService.addClient(list);
        return R.ok(isOk);
    }
    @PostMapping("/addOrder")
    public R addAll(@RequestBody Order order){
        System.out.println("list-----"+order);
        boolean isOk = orderService.adOrder(order);
        return R.ok(isOk);
    }

    /**
     * 上传Excel文件
     */
    @CrossOrigin
    @PostMapping("/upload/excel")
    public R uploadExcel(MultipartFile file) {
        try {
            // 重点,此处第三个参数需要传入Service对象
            EasyExcel.read(file.getInputStream(),
                            Order.class,
                            new OrderReadListener(orderService))
                    .sheet().doRead();
        } catch (Exception e) {
            e.printStackTrace();
            return R.fail(e.getMessage());
        }
        return R.ok();

    }

    /**
     * 下载Excel文件
     * 注意,返回值是void
     */
    @GetMapping("/download/excel")
    public void downloadExcel(HttpServletResponse response) throws IOException {

        //  查询数据库全部数据
        List<Order> list = orderService.findAll(null);

        // 下面这个注释是前端使用方式1,即a标签发请求时采用
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        String fileName = URLEncoder.encode("计量单位信息", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        // easyexcel导出工具
        EasyExcel.write(response.getOutputStream(), Order.class).autoCloseStream(Boolean.FALSE).sheet("计量单位信息")
                .doWrite(list);
    }
}
